package com.example.java.yugutou.chapter1_linklist.level1;

/**
 * @Author : 佩萁
 * Description :JVM是如何构造链表的
 * @Create : 2023/11/29 - 9:50
 */
public class BasicLink {
    public static void main(String[] args) {
        //创建一个数组，里面的元素是我们要放入节点的val值
        int[] a = {1, 2, 3, 4, 5, 6};
        //创建链表函数，返回头指针head，这个head是头结点的位置
        Node head = initLinkedList(a);
        //打印
        System.out.println(head.val);
    }


    static Node initLinkedList(int[] array) {//传入一个数组，数组元素是链表的val值
        //创建头指针和头结点，初始化为空，初始化一个head的目的是不论到哪都能找到这个链表的头，因为这是个单向链表
        Node head = null, cur = null;
        //循环遍历传入的数组来为结点的val赋值
        for (int i = 0; i < array.length; i++) {
            //创建一个尾指针为null，不指向任何结点的结点
            Node newNode = new Node(array[i]);
            //newNode.next = null;
            //如果是遍历数组中第一个位置的，应该让初始化的头指针和头结点赋值个新建的结点newNode
            if (i == 0) {
                //头指针指向第一个新结点，它需要一直保留，所以在下面的else中就不再修改它的值了
                head = newNode;
                cur = newNode;//当前节点为新结点
            } else {//如果i不是0，说明在此之前已经有节点了，需要让前面的结点指向这个新创建的结点
                cur.next = newNode;//当前节点指向新结点
                cur = newNode;//当前节点更新为新结点
            }
        }
        return head;//返回头指针
    }

    //创建结点的函数
    static class Node {
        public int val;//结点的val属性
        public Node next;//指向下一个结点的next指针

        //结点构造器
        public Node(int x) {
            val = x;//将x赋值为结点的val
            next = null;//结点的尾指针默认为空，不指向任何结点
        }
    }
}